package cn.lizemin.controller;

import cn.lizemin.entity.Product;
import cn.lizemin.feignclient.ProductClient;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author lzm
 * @version 1.0
 * @description: 商品类别服务接口
 * @date 2022/3/1 15:12
 */

@RestController
public class CategoryController {

    private static final Logger log = LoggerFactory.getLogger(CategoryController.class);

    @Autowired
    private ProductClient productClient;

    @GetMapping("/category")
    public String category(){
        /**
         * 测试openfeign的服务调用
         */
        log.info("category service ....");
        //1.RestTemplate 2.RestTemplate+Ribbon() 3.OpenFeign
//
        String product = productClient.product();
        String list = productClient.list();

        log.info("结果1：{}",product);
        log.info("结果2：{}",list);
        return "category ok !! " + product;

        /**
         * 测试以非restful风格的方式传递参数，调用商品服务
         */
//        log.info("category service ....");
//        String result = productClient.test("lzm", 28);
//        return "category ok !! " + result;

        /**
         * 测试以restful风格的方式传递参数，调用商品服务
         */
//        log.info("category service ....");
//        String result = productClient.test1(3, "lzm");
//        return "category ok !! " + result;
        /**
         * 测试以JSON格式传递 对象类型的 整装参数，调用商品服务
         */
//        log.info("category service ....");
//        String result = productClient.test2(new Product(1, "超短裙", 23.23, new Date()));
//        return "category ok !! " + result;

        /**
         * 测试传递数组类型的参数给product服务
         */
//        log.info("category service ....");
//        String result = productClient.test3(new String[]{"21","23","24"});
//        return "category ok !! " + result;

        /**
         * 测试传递集合类型的参数给product服务（集合的传参和数组的传参形式是一样的？ids=23&ids=28）
         */
//        log.info("category service ....");
//        String result = productClient.test4(new String[]{"21","23","24"});
//        return "category ok !! " + result;

    }

    /**
     * 测试接收对象类型的参数
     *
     * 测试调用商品服务后，接收其返回来的json，并将其转成对象
     * @return
     */
    @GetMapping("/category2")
    public Product category2(){
        Product product = productClient.product(21);
        log.info("product: {}",product);
        return product;
    }

    /**
     * 测试接收对象类型的参数
     *
     * 测试调用商品服务后，接收其返回来的json，并将其转成对象
     * @return
     */
    @GetMapping("/category3")
    public List<Product> category3(){
        List<Product> products = productClient.findByCategoryId(1);
        products.forEach(product -> log.info("product: {}",product));
        return products;
    }

    /**
     * 测试复杂的内嵌型对象json ,通过二次序列化的方式
     * @return
     */
    @GetMapping("/category4")
    public String category4(){
        String result = productClient.findByCategoryIdAndPage(1, 5, 1);
        System.out.println(result);

        //自定义json反序列化   对象转为json 序列化   on字符串转为对象
        /**
         * 第一次反序列化：将其转成JSONObject对象，相当于一个map
         */
        JSONObject jsonObject = JSONObject.parseObject(result);
        System.out.println(jsonObject.get("total"));
        Object rows = jsonObject.get("rows");
        System.out.println(rows);

        /**
         * 第二次json反序列化： 将某个JSON数据转换成java对象
         */
        List<Product> products = jsonObject.parseArray(rows.toString(), Product.class);
        products.forEach(product -> {
            log.info("product:{}",product);
        });

        return result;
    }

    /**
     * 测试访问网关的/list接口，是走/product/list，还是/category/list
     * @return
     */
    @GetMapping("/list")
    public String list(){
        return "category list ok";
    }



}
